using System;
using Synapse.Framework.Pipe.Operations;

namespace Synapse.Framework.Pipe.PipeLines
{
    public interface IPipe<in TPump, out TInput, out TX> 
    {
        void Pump(TPump input);
        IPipe<TPump, TOutput, TInput> Pin<TOutput>(IOperation<TInput, TOutput> operation);
        IPipe<TPump, TOutput, TInput> Pin<TOutput>(Func<TInput, TOutput> operation);
        IPipe<TPump, TOutput, TInput> Pin<TOutput>(Func<IPipe<TPump,  TInput, TX>, IOperation<TInput, TOutput>> operation);
    }
}